package gbench.appdemo.ggplot.layer.geom;

import java.awt.Font;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import gbench.common.matlib.data.DataReader.DFrame;
import gbench.common.matlib.img.ImageOps;
import gbench.common.matlib.matrix.MatrixOps.Tuple2;
import gbench.appdemo.ggplot.aes.Aesthetics;
import gbench.appdemo.ggplot.layer.Layer;
import gbench.appdemo.ggplot.plot.panel.SinkPanel;
import gbench.appdemo.ggplot.util.TextUtil;
import static gbench.common.matlib.matrix.MatrixOps.Tuple2.*;

/**
 * 文本内容输出
 * @author gbench
 *
 */
public class GeomText  extends Layer{

    public GeomText(DFrame dataframe,Aesthetics mappings) {
        super(mappings, dataframe);
    }
    
    /**
    * aes 映射参数: <br>
     * x：点的位置坐标 水平,必须 <br>
     * y: 点的位置坐标 垂直 ,必须<br>
     * color: 字体颜色 <br>
     * fontsize: 字体大小 <br>
     * fontstyle：字体式样<br>
     * text:文本内容<br>
     * @param dataframe 数据框
     * @param mappings  绘图属性映射
     * @return GeomText
     */
    public static GeomText geom_text(DFrame dataframe,Aesthetics mappings) {
        return new GeomText(dataframe,mappings);
    }
    
    /**
     * aes 映射参数: <br>
     * x：点的位置坐标 水平,必须 <br>
     * y: 点的位置坐标 垂直 ,必须<br>
     * color: 字体颜色 <br>
     * fontsize: 字体大小 <br>
     * fontstyle：字体式样<br>
     * text:文本内容<br>
     * 
     * @param mappings 绘图属性映射
     * @return GeomText
     */
    public static GeomText geom_text(Aesthetics mappings) {
        return new GeomText(null,mappings);
    }
    
    /**
     * 是否是覆盖层：覆盖层不参与缩放框的编辑
     * @return 是否是覆盖层 true覆盖层,false 不是覆盖层
     */
    @Override
    public boolean isOverlayer() {
        return true;
    }
    
    /**
     * 图层计算
     * 
     * aes 映射参数: <br>
     * x：点的位置坐标 水平,必须 <br>
     * y: 点的位置坐标 垂直 ,必须<br>
     * color: 字体颜色 <br>
     * fontsize: 字体大小 <br>
     * fontstyle：字体式样<br>
     * text:文本内容<br>
     * @param panel 绘图面板
     * @return
     */
    @Override
    public Stream<Tuple2<Tuple2<Double, Double>, int[]>> evaluate(SinkPanel panel) {
        final var x = this.get("x");// 提取数据 行坐标
        final var y = this.get("y"); // 提取数据 列坐标
        final var texts = this.get(rec->rec.lla("text", String.class)); // 提取数据：文本信息
        final var rgbstr = this.getAes("color", "#ff0000"); // 提取颜色映射
        final var fontsize = this.getAes("fontsize", 10); // 提取字体大小
        final var fontstyle = this.getAes("fontstyle", Font.CENTER_BASELINE); // 提取字体式样
        final var rgb = ImageOps.rgb(rgbstr);// 像素点颜色
        final var points = (this.getAes("flip", false) // 是否做xy旋转
            ? Tuple2.zip(y.data(), x.data())
            : Tuple2.zip(x.data(), y.data())
            ).collect(Collectors.toList());
        final var ai = new AtomicInteger(0);
        final var n = texts.size();
        return points.stream().map(tup->TUP2(tup,TextUtil.rgbSizeStyleText(rgb,fontsize,fontstyle,texts.get(ai.getAndIncrement()%n))));
    }
    
}
